<?php

require_once(dirname(__FILE__) . '/script-prepend.php');
require_once(dirname(__FILE__) . '/../inc/dao/CdrStatsDao.php');
/*
 * Script de chargement des CDR
 * Accède au FTP et enregistre les CDR en BDD
 * Ajouter l'option 'all' pour charger tout les CDR
 * lancer le script en cronjobs sans options toutes les heures pour les routines :
 */
//cronjob :  */58 * * * * php cd <full_base_folder> && www/shell-scripts/LoadRatedCDRs.php

$handler = new LoadRatedCDRs();
$handler->process();

class LoadRatedCDRs {

    private $ftp = null;

    const BASE_FTP_PATH = '/WholesaleCDRs/RatedCDRs/';
    const BUFFER_FILE   = 'cache/buffer';

    /**
     * Procède à la lecture du ftp
     * @return mixed
     */
    public function process() {
        $cdrFiles = $this->getCDRsFilesList();
        $cdrDb    = $this->getCDRsDBList();

        //parcours des fichiers du FTP
        foreach ($cdrFiles as $file) {
            if (!in_array($file, $cdrDb)) {
                $csv = $this->getFile($file);
                //si le fichier n'est pas répertorié en base, on l'ajoute
                $this->persistFullCsv($csv);
            }
        }
        $this->closeFtpConnection();
    }

    /**
     * Persiste un CSV en BDD
     * @param string $csv
     */
    private function persistFullCsv($filename) {
        echo "\033[34m Enregistrement d'un fichier en base ... \033[0m\n";
        $csv          = fopen(self::BUFFER_FILE, 'r');
        $valuesString = '';
        $i            = 0;
        while (($line         = fgetcsv($csv)) !== FALSE) {
            $i++;
            if ($i === 1) {
                continue;
            }

            $arrayValues = explode(";", $line[0]);
            foreach ($arrayValues as $key => $a) {
                $arrayValues[$key] = mysql_escape_string($a);
            }
            //supression de la dernière cellule si > 23
            if (count($arrayValues) > 22) {
                $line[0] = implode(";", array_slice($arrayValues, 0, 22));
            } elseif (count($arrayValues) < 22) {

                $line[0] = implode(";", array_pad($arrayValues, 22, ''));
            } else {
                $line[0] = implode(";", $arrayValues);
            }
            if ($i % 8 === 0)
                echo ".";
            $valuesString .= "('$filename', '" . str_replace(';', "', '", $line[0]) . "'),";
        }
        echo ".";
        CdrStatsDao::insertBunch(rtrim($valuesString, ",") . ';');
        fclose($csv);
        echo "\n\033[32m Ok !\033[0m\n";
    }

    /**
     * Retourne un fichier du FTP
     * @param type $filename
     */
    private function getFile($filename) {
        echo "\033[34m Ouverture du fichier distant \033[0m$filename ... \033[0m\n";
        // Initialise le téléchargement
        $ret = ftp_nb_get($this->getFtpConnection(), self::BUFFER_FILE, self::BASE_FTP_PATH . $filename, FTP_BINARY);
        if ($ret === FTP_FAILED) {
            $ret = ftp_nb_get($this->getFtpConnection(), self::BUFFER_FILE, self::BASE_FTP_PATH . $filename, FTP_BINARY);
        }
        while ($ret == FTP_MOREDATA) {
            echo ".";
            // Continue le téléchargement...
            $ret = ftp_nb_continue($this->getFtpConnection());
        }
        if ($ret === FTP_FINISHED) {
            echo "\n\033[32m Ok !\033[0m\n";
            return $filename;
        } else {
            echo "\033[31m Erreur lors du téléchargement du fichier $filename\033[0m \n";
            die(1);
        }
    }

    /**
     * Retourne la liste des CDRs du FTP
     * @return array
     */
    private function getCDRsFilesList() {
        echo "Lecture du répertoire " . self::BASE_FTP_PATH . " ... \n";
        // Récupère la liste des fichiers de /WholesaleCDRs/RatedCDRs
        $list = ftp_nlist($this->getFtpConnection(), self::BASE_FTP_PATH);

        if (false === $list) {
            $list = ftp_nlist($this->reconnectFTP()->getFtpConnection(), self::BASE_FTP_PATH);
        }

        unset($list[0]);
        unset($list[1]);

        return $list;
    }

    /**
     * Retourne la liste des CDRs déja enregistrés en BDD
     * @return array
     */
    private function getCDRsDBList() {
        return CdrStatsDao::getAllFilenames();
    }

    /**
     * Retourne la connexion au FTP
     * @return type
     */
    private function getFtpConnection() {
        try {
            if (is_null($this->ftp)) {
                echo "\033[34m Connexion au FTP ... \033[0m\n";
                // Mise en place d'une connexion basique
                $this->ftp = ftp_connect(MM_FTP_HOST);
                if (!$this->ftp) {
                    echo "\033[31m Erreur lors de la connexion au FTP !\033[0m \n";
                    die(1);
                }
                ftp_login($this->ftp, MM_FTP_USERNAME, MM_FTP_PASSWORD);
            }
        } catch (Exception $exc) {
            echo "\033[31m Erreur lors de la connexion au FTP !\033[0m \n";
            die(1);
        }

        return $this->ftp;
    }

    /**
     * Reset la connexion au FTP
     * @return type
     */
    private function reconnectFtp() {
        try {
            echo "\033[34m Reconnexion au FTP ... \033[0m\n";
            ftp_login($this->ftp, MM_FTP_USERNAME, MM_FTP_PASSWORD);
        } catch (Exception $exc) {
            // Mise en place d'une connexion basique
            $this->ftp = ftp_connect(MM_FTP_HOST);
            if (!$this->ftp) {
                echo "\033[31m Erreur lors de la connexion au FTP !\033[0m \n";
                die(1);
            } else {
                return $this->reconnectFtp();
            }
        }
        return $this;
    }

    /**
     * Ferme la connexion au FTP
     */
    private function closeFtpConnection() {
        if (!is_null($this->ftp)) {
            ftp_close($this->ftp);
        }
    }

}
